package com.coder.ipc.messenger

import android.app.Service
import android.content.Context
import android.content.Intent
import android.os.*
import android.widget.Toast

/** 命令服务以显示消息 */
const val MSG_SAY_HELLO = 1

/**
 * 使用 Messenger
 *
 * @author yuhushuan
 * @date 2020/12/13 22:10
 */
class MessengerService : Service() {

    /**
     * 我们发布给客户的目标，以将消息发送到 IncomingHandler。
     */
    private lateinit var mMessenger: Messenger

    /**
     * 来自客户端的传入消息的处理程序。
     */
    internal class IncomingHandler(
            context: Context,
            private val applicationContext: Context = context.applicationContext) : Handler() {
        override fun handleMessage(msg: Message) {
            when (msg.what) {
                MSG_SAY_HELLO -> {
                    Toast.makeText(applicationContext, "hello!", Toast.LENGTH_SHORT).show()
                    // 可以获取 Bundle 对象
                    val bundle = msg.data
                    // 可以获取客户端的 Messenger
                    val clientMessenger = msg.replyTo
                    clientMessenger?.let { messenger ->
                        val replyMsg = Message.obtain(null, 2)
                        // 可以传递 Bundle 对象
                        replyMsg.data = Bundle()
                        try {
                            messenger.send(replyMsg)
                        } catch (e: RemoteException) {
                            e.printStackTrace()
                        }
                    }

                }
                else -> super.handleMessage(msg)
            }
        }
    }


    /**
     * 当绑定到服务时，我们将接口返回到 Messenger，以将消息发送到服务。
     */
    override fun onBind(intent: Intent?): IBinder? {
        Toast.makeText(applicationContext, "binding", Toast.LENGTH_SHORT).show()
        mMessenger = Messenger(IncomingHandler(this))
        return mMessenger.binder
    }

}
